/**
 * Created by Sergey on 14.03.14.
 */

/**
 * Store clone of answer row
 * Хранит копию строки ответа
 * @type {Object}
 */
var answerRowCopy = null;

/**
 * Store clone of question row
 * Хранит копию строки вопроса
 * @type {Object}
 */
var questionRowCopy = null;

function createCommonUiElements() {
    $(".jquery-datepicker")
        .datepicker({dateFormat: "dd.mm.yy"});

    var quizStartDate = $("#quiz_start_date");
    var quizEndDate = $("#quiz_end_date");

    if (quizStartDate.val().length == 0 && quizEndDate.val().length == 0) {
        var today = new Date();
        var afterWeek = new Date(today.getTime() + (7 * 24 * 60 * 60 * 1000));

        quizStartDate.datepicker("setDate", today);
        quizEndDate.datepicker("setDate", afterWeek);
    }
}

function createQuizTableUiElements() {
    var quizForm = $(".quiz-form");
    quizForm.find("textarea, input").tooltip({
        position: {
            at: "right top",
            my: "left bottom"
        }
    });
    quizForm.find("input[type='button']").button().css({fontSize: "0.75em"});
    quizForm.find("input[type='submit']").button().css({
        fontSize: "0.9em",
        fontWeight: "bold"
    });
}

function createRowsClones() {
    var aRow = $(".answer-row");
    answerRowCopy = aRow.clone();
    aRow.remove();

    var qRow = $(".question-row");
    questionRowCopy = qRow.clone();
    qRow.remove();
}

function addNewQuestionRow(answersCount) {
    answersCount = (typeof a !== 'undefined') ? answersCount : 4;

    if (answerRowCopy == null || questionRowCopy == null)
        createRowsClones();

    var questionsTableBody = $(".questions-table > tbody");
    var row = questionRowCopy.clone().show();
    questionsTableBody.append(row);

    addQuestionRowsHandlers();

    // Добавляем некоторое кол-во ответов по умолчанию
    var questionIndex = row.index();
    for (var i = 0; i < answersCount; i++) {
        addAnswerRow(questionIndex);
    }
}

function addQuestionRowsHandlers() {
    var row = $(".question-row");
    row.find(".add-answer").click(function () {
        var qIndex = $(this).closest(".question-row").index();
        addAnswerRow(qIndex);
    });
    row.find(".answers-yes-no").click(function () {
        var qIndex = $(this).closest(".question-row").index();
        buildAnswersYesNo(qIndex);
    });

    // Обработка события нажатия кнопки "Удалить вопрос"
    row.find(".remove-question").click(function () {
        var questionRow = $(this).closest(".question-row");
        if (questionRow.parent().find(".question-row").length > 1) {
            questionRow.remove();
            runFieldsIndexation();
        }
    });
}

function addAnswerRow(questionIndex) {
    var answersTableBody = $(".questions-table > tbody > tr:eq(" + (questionIndex) + ")")
        .find(".answers-table tbody");

    var row = answerRowCopy.clone().show();
    answersTableBody.append(row);

    row.find(".remove-answer").click(function () {
        var answerRow = $(this).closest(".answer-row");
        if (answerRow.parent().find(".answer-row").length > 2) {
            answerRow.remove();
            runFieldsIndexation();
        }
    });

    createQuizTableUiElements();
    runFieldsIndexation();
    return row;
}

function buildAnswersYesNo(questionIndex) {
    $(".questions-table > tbody > tr:eq(" + (questionIndex) + ") .answer-row").remove();

    var rowAnswerYes = addAnswerRow(questionIndex);
    rowAnswerYes.find("input[type='text']").val("Да");

    var rowAnswerNo = addAnswerRow(questionIndex);
    rowAnswerNo.find("input[type='text']").val("Нет");
}

/**
 * Run indexation of textareas and inputs
 * Запускает индексацию заполняемых полей формы - это нужно для того, чтобы при отправке формы сформировался
 * один массив, в котором будут вопросы и ответы
 */
function runFieldsIndexation() {
    $(".question-row").each(function () {
        var questionRow = $(this);

        questionRow.children("td:eq(0)").text(questionRow.index() + 1);

        var textAreaName = "questions[" + questionRow.index() + "][content]";
        questionRow.find("textarea[name='question_content']").attr("name", textAreaName);

        var answerRows = questionRow.find(".answer-row");
        answerRows.each(function () {
            var row = $(this);
            $(this).find("input[name^='answer_id']").each(function (index) {
                var name =
                    "questions[" + questionRow.index() +
                    "][answers][" + row.index() + "][id]";
                $(this).attr("name", name);
            });
            $(this).find("input[name^='answer_checked']").each(function (index) {
                var name =
                    "questions[" + questionRow.index() +
                    "][answers][" + row.index() + "][correct]";
                $(this).attr("name", name);
            });
            $(this).find("input[name^='answer_text']").each(function (index) {
                var name =
                    "questions[" + questionRow.index() +
                    "][answers][" + row.index() + "][content]";
                $(this).attr("name", name);
            });
        });
    });
}

function validateQuizForm() {
    var success = true;
    var errors = "";
    var questionRows = $(this).find("tr.question-row");
    questionRows.each(function () {
        var row = $(this);

        // Проверяем все ли элементы textarea заполнены - вопрос не может быть пустой строкой
        row.find("textarea").each(function () {
            $(this).closest("td").removeClass("error");
            if ($(this).val().length == 0) {
                success = false;
                errors += "Текст вопроса не должен быть пустой строкой<br>";
                $(this).closest("td").addClass("error");
            }
        });

        // Проверяем заполнены ли все элементы input - ответ не может быть пустой строкой
        row.find("input[type='text']").each(function () {
            $(this).closest(".answer-row").removeClass("error");
            if ($(this).val().length == 0) {
                success = false;
                errors += "Текст ответа не должен быть пустой строкой<br>";
                $(this).closest(".answer-row").addClass("error");
            }
        });

        var checkboxes = row.find("input[type='checkbox']");
        var checkboxesChecked = row.find("input[type='checkbox']:checked");

        checkboxes.closest("td").removeClass("error");
        if (checkboxes.length == checkboxesChecked.length) {
            checkboxes.closest("td").addClass("error");
            success = false;
            errors += "Все варианты ответа не могут быть отмечены как правильные<br>";
        } else if (checkboxesChecked.length < 1) {
            checkboxes.closest("td").addClass("error");
            success = false;
            errors += "Должен быть хотя бы один правильный вариант ответа<br>";
        }
    });
    //$("#errors-console").html(errors);

    return success;
}

/**
 * OnLoad page handler
 * Перехват события завершения загрузки страницы
 */
$(function () {
    createRowsClones();
    runFieldsIndexation();
    addQuestionRowsHandlers();
    createCommonUiElements();
    createQuizTableUiElements();

    var quizForm = $(".quiz-form");
    quizForm.submit(validateQuizForm);

    $(".add-question").click(function () {
        addNewQuestionRow(4);
        createQuizTableUiElements();
    });
});